<?php

namespace app\common\traits;

use app\common\library\exception\ApiException;
use think\Db;
use think\Exception;
use think\Log;

trait InterfacesExceptionTrait
{
    use Error;

    /**
     * 捕获异常
     * @param $callback
     * @return bool
     */
    protected function exception($callback)
    {
        $result = false;
        $handleResult = function ($e) {
            /**@var Exception $e */
            $msg = $e->getMessage() . '\n' . $e->getTraceAsString();
            $code = $e->getCode();
            if ($e instanceof ApiException) {
                $this->setHttpCode($e->httpCode);
            } else {
                if (!config('app_debug')) {
                    $msg = "系统错误啦";
                }
                return $this->addError($msg, 500);
            }

            if (!config('app_debug')) {
                $msg = $e->getMessage();
            }

            return $this->addError($msg, $code);

        };

        try {
            $result = $callback();
        } catch (Exception $e) {
            $handleResult($e);
        }

        return $result;
    }

    protected function transException($callback)
    {
        $result = false;
        $handleResult = function ($e) {
            /**@var Exception $e */
//            $msg = $e->getMessage() . '\n' . $e->getTraceAsString();
            $msg = $e->getMessage();
            $code = $e->getCode();
//            if ($e instanceof ApiException) {
//
//            } else {
//                if (!config('app.app_debug')) {
//                    $msg = "系统错误啦";
//                }
//                return $this->addError($msg, 500);
//            }
//            if (!config('app.app_debug')) {
//                $msg = $e->getMessage();
//            }

            return $this->addError($msg, $code);

        };

        try {
            Db::startTrans();
            $result = $callback();
            Db::commit();
        } catch (Exception $e) {
            $handleResult($e);
            Db::rollback();
        }

        return $result;
    }
}